home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 April / EnigmA AMIGA RUN 17 (1997)(G.R. Edizioni)(IT)[!][issue 1997-04][EAR-CD].iso / EARCD / comm / ums / IntuiNews1_4a.lha / UMS / Rexx / Mails2Guide.intui < prev    next >
Text File  |  1996-05-28  |  11KB  |  475 lines

  1. /* ARexx - Script fuer IntuiNews */
  2.  
  3. /*
  4. ** $VER: Mails2Guide.intui 1.0 (14.04.96) Copyright (c) Kristian Laß.
  5. ** Basierend auf Mails2Guide.mdmrexx 1.3 (25.06.95) Copyright (c) Jürgen Kohrmeyer.
  6. **
  7. ** Beschreibung:
  8. ** -------------
  9. ** Das Script erstellt aus allen markierten Nachrichten
  10. ** eine Datei im Amigaguide-Format.
  11. **
  12. **
  13. ** Installation:
  14. ** -------------
  15. ** Das Skript selber muß nach Rexx: kopiert werden. Anschließend muß
  16. ** die Konfigurationsvariable IntuiNews.Rexx um eine Zeile ähnlich
  17. ** folgender erweitert werden:
  18. ** ArticleWindow          F7      Mails2Guide.intui
  19. ** Mit Hilfe der entsprechenden F-Taste kann das Skript dann aufgerufen
  20. ** werden.
  21. **
  22. ** Am Anfang des Scripts können einige Parmeter eingestellt werden:
  23. **
  24. ** verzeichnis - Gibt ein Verzeichnis an, das beim Aufruf des
  25. **               Filerequesters als Standard verwendet wird.
  26. **
  27. ** multiview   - Gibt das Anzeigeprogramm für den Guide an, %s
  28. **               dient dabei als Platzhalter für den Namen des
  29. **               Publicscreens von IntuiNews.
  30. **
  31. ** leerzeilen  - Gibt an, ob auf der Titelseite zwischen den
  32. **               einzelnen Threads Leerzeilen stehen sollen.
  33. **               0 = Nein, 1 = Ja
  34. **
  35. ** backups     - Gibt an, ob bei bereits existierendem Guide
  36. **               eine Sicherheitskopie angelegt werden soll.
  37. **               0 = Nein, 1 = Ja
  38. **
  39. **
  40. ** Funktionelle Änderungen gegenüber Mails2Guide.mdmrexx:
  41. ** ------------------------------------------------------
  42. ** Anzahl der Gesamtmails in der Gruppe taucht im Guide nicht mehr auf.
  43. ** Versionsabfrage von MicroDot entfernt
  44. ** Titel der Newsgroup taucht nicht im Guide auf, da programmseitig
  45. ** nicht feststellbar.
  46. ** Eventuell einer Nachricht anhängende Binärfiles werden nicht erwähnt
  47. **
  48. **
  49. ** Autor:
  50. ** ------
  51. ** Kristian Laß            EMail: kristian@ceres.ruhr.de
  52. **
  53. **************************************************************************/
  54.  
  55. /*
  56. ** Startverzeichnis für den Filerequest
  57. */
  58.  
  59. verzeichnis = 'RAM:'
  60.  
  61.  
  62. /*
  63. ** Anzeigeprogramm für den Guide
  64. */
  65.  
  66. multiview   = 'SYS:Utilities/MultiView PUBSCREEN %s'
  67.  
  68.  
  69. /*
  70. ** Leerzeilen zwischen Threads erzeugen? (0 = Nein, 1 = Ja)
  71. */
  72.  
  73. leerzeilen = 1
  74.  
  75.  
  76. /*
  77. ** Sicherheitskopie anlegen? (0 = Nein, 1 = Ja)
  78. */
  79.  
  80. backups = 1
  81.  
  82. /*************************************************************************/
  83.  
  84. /* Konstantendeklarationen aus UMSConsts.rexx: */
  85. /* enumeration of fields in an UMS-message */
  86. UMSCODE_MsgText      =  0
  87. UMSCODE_FromName     =  1
  88. UMSCODE_FromAddr     =  2
  89. UMSCODE_ToName       =  3
  90. UMSCODE_ToAddr       =  4
  91. UMSCODE_MsgID        =  5
  92. UMSCODE_CreationDate =  6
  93. UMSCODE_ReceiveDate  =  7
  94. UMSCODE_RefID        =  8
  95. UMSCODE_Group        =  9
  96. UMSCODE_Subject      = 10
  97. UMSCODE_Attributes   = 11
  98. UMSCODE_Comments     = 12
  99. UMSCODE_Organization = 13
  100. UMSCODE_Distribution = 14
  101. UMSCODE_Folder       = 15
  102. UMSCODE_FidoID       = 16
  103. UMSCODE_MausID       = 17
  104. UMSCODE_ReplyGroup   = 18
  105. UMSCODE_ReplyName    = 19
  106. UMSCODE_ReplyAddr    = 20
  107. UMSCODE_FidoText     = 32
  108. UMSCODE_ErrorText    = 33
  109. UMSCODE_Newsreader   = 34
  110.  
  111. /*
  112. ** Beginn des Scripts
  113. */
  114.  
  115. OPTIONS RESULTS
  116. inport = ADDRESS()
  117.  
  118.  
  119. /*
  120. ** Libraries oeffnen
  121. */
  122.  
  123. IF ~SHOW('LIBRARIES','rexxtricks.library') THEN
  124.    IF ~ADDLIB('rexxtricks.library',0,-30,38) THEN
  125.       EXIT(10)
  126.  
  127. IF ~SHOW('LIBRARIES','rexxsupport.library') THEN
  128.    IF ~ADDLIB('rexxsupport.library',0,-30,0) THEN
  129.       EXIT(10)
  130.  
  131. if ~show("L", "ums.library") then do
  132.   if ~addlib("ums.library", 0, -210, 8) then do
  133.     say "ums.library not found!"
  134.     exit(10)
  135.   end
  136. end
  137.  
  138. GETACCOUNT
  139. Account = UMSLogin("", "@"||result, "default")
  140. If Account = 0 Then exit(20)
  141.  
  142. /*
  143. ** Datum ermitteln
  144. */
  145.  
  146. PARSE VALUE DATE('SORTED') WITH 1 jahr 5 monat 7 tag
  147. datum = tag || '.' || monat || '.' || jahr
  148.  
  149.  
  150. /*
  151. ** Namen der Guide-Datei ermitteln
  152. */
  153.  
  154. INFO "SCREEN"
  155. screenname = result
  156.  
  157. address command "requestfile >t:m2g-verzeichnis "||""""||verzeichnis||""""||" pubscreen "||screenname
  158.  
  159. If ~Open("Dateiname","t:m2g-verzeichnis","r") Then do
  160.    UMSLogout(Account)
  161.    EXIT(0)
  162. end
  163.  
  164. guidename = Strip(ReadLn("Dateiname"),,"""")
  165. Close("Dateiname")
  166. address command "delete t:m2g-verzeichnis"
  167.  
  168. guidename = MAKESUFFIX(guidename,'guide','R')
  169.  
  170.  
  171. /*
  172. ** Prüfen ob die Datei bereits existiert
  173. */
  174.  
  175. anhaengen = 0
  176.  
  177. IF EXISTS(guidename) THEN DO
  178.  
  179. /*   REQUEST '"Mails2Guide-Request"' '"**_Überschreiben|An_hängen|_Abbrechen"' '"Die Datei'||'0A'x||guidename||'0A'x||'existiert bereits."' */
  180.    REQUEST '"Mails2Guide-Request"' '"**_Überschreiben|An_hängen|_Abbrechen"' '"Die Datei '||guidename||' existiert bereits."'
  181.    auswahl=result
  182.  
  183.    IF auswahl = 0 THEN DO
  184.       UMSLogout(Account)
  185.       EXIT(0)
  186.    END
  187.  
  188.    IF auswahl = 2 THEN DO
  189.       anhaengen = 1
  190.  
  191.       IF ~READFILE(guidename,'alt') THEN
  192.          QUIT('Die Datei'||'0A'x||guidename||'0A'x||'kann nicht gelesen werden!',10)
  193.  
  194.       IF LEFT(alt.1,9) ~= '@database' THEN
  195.          QUIT('Die Datei'||'0A'x||guidename||'0A'x||'ist keine AmigaGuide Datei!',10)
  196.    END
  197.  
  198.    IF backups THEN DO
  199.       ADDRESS COMMAND 'copy' guidename guidename||'.bak'
  200.  
  201.       IF rc ~= 0 THEN
  202.          QUIT('Von der Datei'||'0A'x||guidename||'0A'x||'kann keine Sicherheitskopie angelegt werden!',10)
  203.    END
  204. END
  205.  
  206.  
  207. /*
  208. ** Betreffs und Nummern aller markierten Nachrichten ermitteln
  209. */
  210.  
  211. GETSELMSGNUMS
  212. mailnumbers = RESULT
  213. If Words(mailnumbers) = 0 Then do
  214.     UMSLogout(Account)
  215.     exit(0)
  216. end
  217.  
  218. anzmails = Words(mailnumbers)
  219.  
  220. Do i = 0 to anzmails-1
  221.  
  222.       drop mail.
  223.       If ~UMSReadMsgHeader(Account, Word(mailnumbers, i+1), mail.)
  224.           Then leave /* Unlesbare Nachrichten überspringen */
  225.  
  226.       /* Im Array mailpos wurden die Indexpositionen der Nachrichten festgehalten. Statt mailpos(i) kann Word(mailnumbers,i) o.ä. verwendet werden
  227.       mailpos.i = i */
  228.  
  229.       mid.i = mail.UMSCODE_MsgID
  230.       bez.i = mail.UMSCODE_RefID
  231.       bet.i = mail.UMSCODE_Subject
  232.  
  233.       IF mail.UMSCODE_FromName ~= '' THEN DO
  234.          realname.i = mail.UMSCODE_FromName
  235.          abs.i = mail.UMSCODE_FromAddr '(' || mail.UMSCODE_FromName || ')'
  236.       END
  237.       ELSE DO
  238.          realname.i = mail.UMSCODE_FromAddr
  239.          abs.i = mail.UMSCODE_FromAddr
  240.    END
  241. END
  242.  
  243.  
  244.  
  245. /*
  246. ** Guide-Datei anlegen
  247. */
  248.  
  249. IF ~OPEN('guide',guidename,'W') THEN
  250.    QUIT('Die Datei'||'0A'x||guidename||'0A'x||'kann nicht beschrieben werden!',10)
  251.  
  252. CALL WRITELN('guide','@database umsmsgs.guide')
  253. CALL WRITELN('guide','@node main umsmsgs.guide"')
  254. CALL WRITELN('guide','')
  255. CALL WRITELN('guide',' Nachrichten, Stand' datum || ':')
  256.  
  257.  
  258. /*
  259. ** Bezugsnachricht berechnen
  260. ** Anzahl Zeichen berechnen, die jeder Betreff eingerückt werden muß
  261. ** Länge der längsten Zeile einschließlich Einrückung berechnen
  262. */
  263.  
  264. maxlen = 0
  265.  
  266. DO i = 0 TO anzmails-1
  267.    spaces.i = 0
  268.  
  269.    DO x = 1 TO i
  270.       IF mid.x = bez.i THEN DO
  271.          spaces.i = spaces.x+1
  272.          LEAVE
  273.       END
  274.    END
  275.  
  276.    len = LENGTH(bet.i)+spaces.i
  277.    IF len > maxlen THEN
  278.       maxlen = len
  279. END
  280.  
  281.  
  282. /*
  283. ** Zeilenanfänge für Thread berechnen
  284. */
  285.  
  286. anfang.0 = ''
  287.  
  288. DO i = 0 TO anzmails-1
  289.    SELECT
  290.       WHEN spaces.i = 0 THEN anfang.i = ''
  291.       WHEN spaces.i = 1 THEN anfang.i = '·'
  292.  
  293.       OTHERWISE DO
  294.          succ = i+1
  295.          pred = i-1
  296.          anfang.i = LEFT(anfang.pred,spaces.i-1)
  297.  
  298.          IF spaces.i ~= spaces.pred THEN DO
  299.             bezug = 0
  300.  
  301.             DO x = i TO anzmails
  302.                IF bez.x = bez.pred THEN DO
  303.                   anfang.i = OVERLAY('|',anfang.i,spaces.i-1,1)
  304.                   bezug = 1
  305.                   LEAVE
  306.                END
  307.             END
  308.  
  309.             IF ~bezug & spaces.i >= spaces.pred THEN
  310.                anfang.i = OVERLAY(' ',anfang.i,spaces.i-1,1)
  311.          END
  312.  
  313.          anfang.i = OVERLAY('·',anfang.i,spaces.i,1)
  314.       END
  315.    END
  316. END
  317.  
  318.  
  319. /*
  320. ** Alte Titelseite in den Guide übernehmen
  321. */
  322.  
  323. anzaltmails = 0
  324.  
  325. IF anhaengen THEN DO
  326.    DO zeile = 1 TO alt.0
  327.       IF LEFT(alt.zeile,5) = ' @{" ' THEN
  328.          LEAVE
  329.    END
  330.  
  331.    PARSE VAR alt.zeile anfang '" link "' ende
  332.  
  333.    IF LENGTH(anfang)-6 > maxlen THEN
  334.       maxlen = LENGTH(anfang)-6
  335.  
  336.    CALL WRITELN('guide','')
  337.  
  338.    DO zeile = zeile TO alt.0
  339.       nextzeile = zeile+1
  340.  
  341.       IF alt.zeile = '' & LEFT(alt.nextzeile,8) = '@endnode' THEN
  342.          LEAVE
  343.       ELSE DO
  344.          IF alt.zeile ~= '' THEN DO
  345.             PARSE VAR alt.zeile anfang '" link "' ende
  346.             CALL WRITELN('guide',LEFT(anfang,maxlen+6)||'" link "'||ende)
  347.          END
  348.          ELSE
  349.             CALL WRITELN('guide',alt.zeile)
  350.       END
  351.  
  352.       IF alt.zeile ~= '' THEN
  353.          anzaltmails = anzaltmails+1
  354.    END
  355. END
  356. ELSE DO
  357.    IF ~leerzeilen THEN
  358.       CALL WRITELN('guide','')
  359. END
  360.  
  361.  
  362. /*
  363. ** Neue Titelseite schreiben
  364. */
  365.  
  366. DO i = 0 TO anzmails-1
  367.    buttontext = TRANSLATE(LEFT(bet.i,maxlen-spaces.i),"'",'"')
  368.  
  369.    text = ' ' || anfang.i || '@{"' buttontext '" link "nachricht_' || anzaltmails+i || '"}' realname.i
  370.  
  371.    IF spaces.i = 0 & leerzeilen THEN
  372.       CALL WRITELN('guide','')
  373.  
  374.    CALL WRITELN('guide',text)
  375. END
  376.  
  377. CALL WRITELN('guide','')
  378. CALL WRITELN('guide','@endnode')
  379. CALL WRITELN('guide','')
  380.  
  381.  
  382. /*
  383. ** Alte Nachrichten in den Guide übernehmen
  384. */
  385.  
  386. IF anhaengen THEN DO
  387.    DO zeile = zeile+2 TO alt.0
  388.       CALL WRITELN('guide',alt.zeile)
  389.    END
  390. END
  391.  
  392. CALL CLOSE('guide')
  393.  
  394.  
  395. /*
  396. ** Neue Nachrichten in den Guide schreiben
  397. */
  398.  
  399. node.0 = 8
  400. node.2 = ''
  401. node.7 = ''
  402. node.8 = '--------------------------------------------------------------------------'
  403. node.9 = ''
  404.  
  405. endnode.0 = 2
  406. endnode.1 = '@endnode'
  407. endnode.2 = ''
  408.  
  409. binmail.0 = 2
  410. binmail.2 = ''
  411.  
  412. DO i = 0 TO anzmails-1
  413.    drop mail.
  414.    If ~UMSReadMsgAll(Account, Word(mailnumbers, i+1), mail.)
  415.        Then leave /* Unlesbare Nachrichten überspringen */
  416.  
  417.    node.1 = '@node "nachricht_' || anzaltmails+i || '" "' || TRANSLATE(bet.i,"'",'"') || '"'
  418.  
  419.    node.3 = 'Absender:' abs.i
  420.    node.4 = 'Betreff :' bet.i
  421.    node.5 = 'Datum   :' mail.UMSCODE_CreationDate   /* Wegen des nicht festgelegten Datumsformates ist einfaches Verarbeiten nicht möglich */
  422.    node.6 = 'MsgID   :' mid.i
  423.  
  424.    IF ~WRITEFILE(guidename,'node','A') THEN
  425.       QUIT('Fehler beim Schreiben der Nachrichten!',10)
  426.  
  427.    /* Teil zur Bearbeitung von Binärnachrichten entfernt */
  428.  
  429.    IF OPEN('guide',guidename,'A') THEN
  430.         If Writech('guide',mail.UMSCODE_MsgText)=0 Then
  431.             QUIT('Schreiben eines Nachrichteninhalts fehlgeschlagen!',10)
  432.         Else
  433.             Close('guide')
  434.    Else
  435.        QUIT('Schreiben eines Nachrichteninhalts fehlgeschlagen!',10)
  436.  
  437.    IF ~WRITEFILE(guidename,'endnode','A') THEN
  438.       QUIT('Fehler beim Schreiben der Nachrichten!',10)
  439. END
  440.  
  441. SETPOS 0
  442.  
  443. /*
  444. ** Logoff durchführen
  445. */
  446. UMSLogout(Account)
  447.  
  448.  
  449. /*
  450. ** Gerade erstellten Guide anzeigen
  451. */
  452.  
  453. position = POS('%S',UPPER(multiview))
  454.  
  455. IF position ~= 0 THEN
  456.    commandstring = LEFT(multiview,position-1) || inport || SUBSTR(multiview,position+2) guidename
  457. ELSE
  458.    commandstring = multiview guidename
  459.  
  460. ADDRESS COMMAND commandstring
  461.  
  462. EXIT(0)
  463.  
  464.  
  465. /*
  466. ** Script mit Fehlermeldung beenden
  467. */
  468.  
  469. quit:
  470.    PARSE ARG msg,rcode
  471.  
  472.    UMSLogout(Account)
  473.    REQUEST '"Mails2Guide-Request" "**_Abbrechen" "'||msg||'"'
  474.    EXIT(rcode)
  475.